import { Provider } from '@tarojs/mobx';
import Taro, { Component, Config } from '@tarojs/taro';
import './app.less';
import { setGlobalData, EGlobalDataKey } from './GlobalData';
import global from './globalStore';
import mount from './lifeCycle';
import MMIconFontName from './modules/@wmeimob/taro-design/src/components/icon-font/const';
import Index from './pages/template/index';
import styles from '~/components/tab-bar/index.modules.less'
import pagesIndexStore from './pages/template/index/store';

// 如果需要在 h5 环境中开启 React Devtools
// 取消以下注释：
// if (process.env.NODE_ENV !== 'production' && process.env.TARO_ENV === 'h5')  {
//   require('nerv-devtools')
// }

const store = {
  global,
  pagesIndexStore
};

class App extends Component {
  /**
   * 指定config的类型声明为: Taro.Config
   *
   * 由于 typescript 对于 object 类型推导只能推出 Key 的基本类型
   * 对于像 navigationBarTextStyle: 'black' 这样的推导出的类型是 string
   * 提示和声明 navigationBarTextStyle: 'black' | 'white' 类型冲突, 需要显示声明类型
   */
  config: Config = {
    pages: [
      'pages/template/index/index',
      'pages/demo/index',
      'pages/template/request/index',
      'pages/template/other/index',
      'pages/template/mobx/index',
      'pages/template/login/index',
      'pages/template/test/index',
      'pages/template/decorator/index',
      'pages/template/transparent/index'
    ],
    tabBar: {
      custom: true,
      list: [{
        'pagePath': 'pages/template/index/index',
        'text': '首页'
      }, {
        'pagePath': 'pages/template/request/index',
        'text': '请求'
      }, {
        'pagePath': 'pages/template/other/index',
        'text': '其他'
      }]
    },
    window: {
      // 默认颜色不显示下拉加载的loading图片
      backgroundTextStyle: 'dark',
      navigationBarBackgroundColor: '#fff',
      navigationBarTitleText: 'WeChat',
      navigationBarTextStyle: 'black'
    },
    "permission": {
      "scope.userLocation": {
        "desc": "你的位置信息将用于小程序位置接口的效果展示"
      }
    }
  };

  globalData = {
    userInfo: null
  };

  /**
   * 程序初始化
   *
   * @memberof App
   */
  constructor() {
    super();
    mount();
  }

  // 校验更新
  aoUpdate() {
    const self = this
    // 获取小程序更新机制兼容
    if (Taro.canIUse('getUpdateManager')) {
      const updateManager = Taro.getUpdateManager()
      // 1. 检查小程序是否有新版本发布
      updateManager.onCheckForUpdate((res) => {
        // 请求完新版本信息的回调
        if (res.hasUpdate) {
          // 2. 小程序有新版本，则静默下载新版本，做好更新准备
          updateManager.onUpdateReady(() => {
            Taro.showModal({
              title: '更新提示',
              content: '新版本已经准备好，是否重启应用？',
              success(res) {
                if (res.confirm) {
                  // 3. 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
                  updateManager.applyUpdate()
                } else if (res.cancel) {
                  // 如果需要强制更新，则给出二次弹窗，如果不需要，则这里的代码都可以删掉了
                  Taro.showModal({
                    title: '温馨提示~',
                    content: '本次版本更新涉及到新的功能添加，旧版本无法正常访问的哦~',
                    success(res) {
                      self.autoUpdate()
                      return;
                      // 第二次提示后，强制更新                      
                      if (res.confirm) {
                        // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
                        updateManager.applyUpdate()
                      } else if (res.cancel) {
                        // 重新回到版本更新提示
                        self.autoUpdate()
                      }
                    }
                  })
                }
              }
            })
          })
          updateManager.onUpdateFailed(() => {
            // 新的版本下载失败
            Taro.showModal({
              title: '已经有新版本了哟~',
              content: '新版本已经上线啦~，请您删除当前小程序，重新搜索打开哟~'
            })
          })
        }
      })
    } else {
      // 如果希望用户在最新版本的客户端上体验您的小程序，可以这样子提示
      Taro.showModal({
        title: '提示',
        content: '当前微信版本过低，无法使用该功能，请升级到最新微信版本后重试。'
      })
    }
  }

  omponentDidMount() {
    this.hasNewBanben()
    const nav = [{
      // iconfont: MMIconFontName.Admin,
      image: styles.sop,
      imageSelected: styles.sopHover,
      'url': '/pages/template/index/index',
      'text': '首页'
    }, {
      iconfont: MMIconFontName.Aftermarket,
      'url': '/pages/template/request/index',
      'text': '请求'
    }, {
      iconfont: MMIconFontName.Camera,
      'url': '/pages/template/other/index',
      'text': '其他'
    }]
    setGlobalData(EGlobalDataKey.Tabs, nav);
  }

  // 在 App 类中的 render() 函数没有实际作用
  // 请勿修改此函数
  render() {
    return (
      <Provider store={store}>
        <Index />
      </Provider>
    );
  }
}

Taro.render(<App />, document.getElementById('app'));
